home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / gpen32k / source / src / gpen32k.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  25.2 KB  |  1,037 lines

  1. /*****************************************************************
  2.         TOWNSマルチバッファパターンエディタ
  3.             G-Pen32k        ver.1.063 フリコレ用
  4.                         Copyright(C) 1991-1994 Okome
  5. *****************************************************************/
  6.  
  7. #include    <stdio.h>
  8. #include    <io.h>
  9. #include    <stdlib.h>
  10. #include    <string.h>
  11. #include    <math.h>
  12. #include    <fmcfrb.h>
  13. #include    <EGB.H>
  14. #include    <MOS.H>
  15. #include    <kkstr2.h>
  16. #include    <normlib.h>
  17. #include    <okome.h>
  18. #define    MAIN
  19. #include    <GPen32k.h>
  20. #undef    MAIN
  21. #include    <old.h>
  22. /*    #include    <rpgpat.h>    */
  23.  
  24. void endu(void)
  25. {
  26.     if(message2(1, "G-Pen32kを終了します", 2)==0)
  27.         end();
  28. }
  29.  
  30. void draw()        /*    画面初期化    */
  31. {
  32.     int i, x, y;
  33.     char c[64] = {    0x00,0x00,    0x10,0x00,    0x00,0x02,    0x10,0x02,
  34.                     0x00,0x40,    0x10,0x40,    0x00,0x42,    0x10,0x42,
  35.                     0x08,0x21,    0x1f,0x00,    0xe0,0x03,    0xff,0x03,
  36.                     0x00,0x7c,    0x1f,0x7c,    0xe0,0x7f,    0xff,0x7f };
  37.     char *tl[] = {"~","/","□","■","○","●","楕○","楕●","↑↓","←→",
  38.                 "Poly","塗","Copy","Roll","ぼけ","回転","拡縮","反転",
  39.                 "mono","mono",
  40.                 "⇔","⇔重","~","Roll","色々","もわ" };
  41.     wpg(0);
  42.     EGB_tmenuPalette2( work );
  43.     MEN_sidein(2);        /*    メニューへのサイドワークの追加    */
  44.     MEN_set(2);
  45.     font12( 592, 16, "大  終", 15 );
  46. /*    font12( 615, 16, "終", 15 );    */
  47.     boxf( 0, 20, 639, 479, BCL );
  48.     KAN_disp(KAN_DISPON);
  49.     KAN_setMode(0x30140);
  50.     wpg(1);
  51.     EGB_displayStart( work, 2, bi, bi );
  52.     EGB_displayStart( work, 3, 640/bi, 480/bi );
  53.     egbputZ( CSX1, CSY1, CSX2, CSY2, 16, 1, c );
  54.     colmix(1, 0);
  55.     colmix(2, 1);
  56.     wpg(0);
  57.     biboxbf( WX1, WY1, WX2, WY2, 0, 8, 8 );
  58.     biboxbf( BX1, BY1, BX2, BY2, 0, 8, 8 );
  59.     biboxbf( NX1, NY1, NX2, NY2, 0, 4, 4 );
  60.     biboxbf( CSX1, CSY1, CSX2, CSY2, 0, 2, 2 );
  61.     biubox( CBLX1-1, CBY1-1, CBRX2+1, CBY2+1, 15, 8, BCL );
  62.     biubox( CBX1, CBY1, CBX2, CBY2, 8, 15, 0 );
  63.     biubox( CBLX1, CBLY1, CBLX2, CBLY2, 8, 15, 0 );
  64.     biubox( CBRX1, CBRY1, CBRX2, CBRY2, 8, 15, 0 );
  65.     ubox( CSBX1, CSBY1, CSBX2, CSBY2, 15, 8 );
  66.     for ( i = 0; i < MEZ0; i++ ) {
  67.         x = i % MEX2;
  68.         y = i / MEX2;
  69.         uboxf( MEX1+MEX4*x, MEY1+MEY4*y,
  70.               MEX1+MEX4*(x+1)-1, MEY1+MEY4*(y+1)-1, 15, 8, (i<MEZ1) ? 7 : 12 );
  71.         symbol(MEX1+MEX4*x+MEX4/2-strlen(tl[i])*4,MEY1+MEY4*y+18,
  72.                tl[i], 16, 15 );
  73.     }
  74.     wkugiri(1);
  75.     biubox( PALX-32/bi, PALY-28/bi, PALX+127+6/bi, PALY+PALB*3-1+4/bi,
  76.              15, 8, BCL );
  77.     biubox( PALX, PALY, PALX+127, PALY+PALB*3-1, 8, 15, 0 );
  78.     biboxbf( PCX1, PCY1, PCX2, PCY2, 0, 0, 0 );
  79.     biboxbf( PLX1, PLY1, PLX2, PLY2, 0, 0, 0 );
  80.     biboxbf( PRX1, PRY1, PRX2, PRY2, 0, 0, 0 );
  81.     ubox( SPX1, SPY1, SPX2, SPY2, 15, 8 );
  82.     ubox( RX1, RY1, RX2, RY2, 15, 8 );
  83.     font12( SPX1+6, SPY2-4, "SPOIT", 15 );
  84.     ubox( PAX1, PAY1, PAX2, PAY2, 8, 15 );
  85.     ubox( HX1, HY1, HX2, HY2, 8, 15 );
  86.     bfgs(1);
  87.     svpp(VX1+128);
  88.     wpg(1);
  89.     hsrg(-1);
  90.     mbclp();
  91.     page(0);
  92. }
  93.  
  94. void gmenu( int mx, int my )        /*    アイコンMENU    */
  95. {
  96.     int x, y, i, j;
  97.     
  98.     i = (( mx - MEX1 ) / MEX4) + MEX2 * (( my - MEY1 ) / MEY4);
  99.     j = ( i<MEZ1 ) ? 0 : 1 ;
  100.     x = MEX1 +((mei[j] + j * MEZ1) % MEX2)* MEX4;
  101.     y = MEY1 + (mei[j] + j * MEZ1) / MEX2 * MEY4;
  102.     mei[j] = i - j * MEZ1;
  103.     mx = MEX1 +(i % MEX2)* MEX4;
  104.     my = MEY1 + i / MEX2 * MEY4;
  105.     wpg(0);
  106.     ubox(  x,  y,  x+MEX4-1,  y+MEY4-1, 15, 8 );
  107.     ubox( mx, my, mx+MEX4-1, my+MEY4-1, 8, 15 );
  108.     wpg(1);
  109. }
  110.  
  111. void raten( int mb, int cx, int cy, int x1, int y1, int x2, int y2, 
  112.                                     int sx1, int sy1, int sx2, int sy2 )
  113. {
  114.     char pa[64], pab[64];
  115.     int n, ws, a, b2, mx, my, c, d;
  116.     int x, y, x3, y3, x4, y4, x5, y5, x6, y6, x7=0, y7=0, x8, y8;
  117.     double ls, xx, yy, ax, ay;
  118.     view( WX1,WY1, WX2,WY2 );
  119.     egbget(x1,y1,x2,y2, b);
  120.     vput2(640/bi,0, 640/bi+x2-x1,y2-y1, b);
  121.     EGB_writePage( work, 0 );
  122.     EGB_writeMode( work, 4 );
  123.     x3 = x1*bi;    y3 = y1*bi;
  124.     x4 = x2*bi;    y4 = y1*bi;
  125.     x5 = x2*bi;    y5 = y2*bi;
  126.     x6 = x1*bi;    y6 = y2*bi;
  127.     MOS_disp(0);
  128.     connect(5, x3,y3, x4,y3, x4,y4, x3,y4, x3,y3, 0x02, 0x7fff );
  129.     MOS_disp(1);
  130.     cx /= bi;
  131.     cy /= bi;
  132.     mbout( &mb, &mx, &my );
  133.     mbin( &mb, &x8, &y8 );
  134.     do {
  135.         MOS_rdpos( &mb, &x, &y );
  136.         if (x7 != x || y7 != y) {
  137.             MOS_disp(0);
  138.             connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
  139.             MOS_disp(1);
  140.             ls = atan2(x8-cx*bi, y8-cy*bi) - atan2(x-cx*bi,y-cy*bi);
  141.             xx = x1 - cx;
  142.             ax = x2 - cx;
  143.             yy = y1 - cy;
  144.             ay = y2 - cy;
  145.             x3 = (cx + xx * cos(ls) - yy * sin(ls))*bi;
  146.             y3 = (cy + xx * sin(ls) + yy * cos(ls))*bi;
  147.             x4 = (cx + ax * cos(ls) - yy * sin(ls))*bi;
  148.             y4 = (cy + ax * sin(ls) + yy * cos(ls))*bi;
  149.             x5 = (cx + ax * cos(ls) - ay * sin(ls))*bi;
  150.             y5 = (cy + ax * sin(ls) + ay * cos(ls))*bi;
  151.             x6 = (cx + xx * cos(ls) - ay * sin(ls))*bi;
  152.             y6 = (cy + xx * sin(ls) + ay * cos(ls))*bi;
  153.             MOS_disp(0);
  154.             connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
  155.             MOS_disp(1);
  156.             x7 = x;
  157.             y7 = y;
  158.         }
  159.     }    while (mb);
  160.     MOS_disp(0);
  161.     connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
  162.     MOS_disp(1);
  163.     EGB_writeMode( work, 0 );
  164.     EGB_writePage( work, 1 );
  165.     WORD(pa) = 4;
  166.     WORD(pa+2) = sx1;
  167.     WORD(pa+4) = sy1;
  168.     WORD(pa+6) = sx2;
  169.     WORD(pa+8) = sy1;
  170.     WORD(pa+10) = sx2;
  171.     WORD(pa+12) = sy2;
  172.     WORD(pa+14) = sx1;
  173.     WORD(pa+16) = sy2;
  174.     EGB_region( work, &n, &ws, &a, &b2, &c, &d, pa );
  175.     pab[0] = 1;
  176.     pab[1] = 0;
  177.     WORD(pab+2) = (cx-x1)/KS+sx1;
  178.     WORD(pab+4) = (cy-y1)/KS+sy1;
  179.     ls *= 180.0 / _PI;
  180.     if (ls<0)
  181.         ls+=360.0;
  182.     if (ls>=360.0)
  183.         ls-=360.0;
  184.     WORD(pab+6) = (int)ls;
  185.     EGB_rotate( work, 0, pab, b );
  186.     wkk();
  187. }
  188.  
  189. void ten(int x, int y, int h)
  190. {
  191.     int i;
  192.     egbget(x,y,x+h-1,y+h-1, b);
  193.     for ( i=0; i<h; i++ )
  194.         vput2(x+i,y,x+i,y+h-1, &b[h*(h-i-1)*2]);
  195. }
  196.  
  197. void rollsub( int x3, int y3, int X1, int Y1, int X3, int Y3 )
  198. {
  199.     int X2, Y2, Y4;
  200.     X2 = X1+X3;
  201.     Y2 = Y1+Y3;
  202.     Y4 = Y3+1;
  203.     egbget( X1, Y1, X1+(x3-1 & X3), Y2, b );
  204.     egbget( X1+x3, Y1, X2, Y2, &(b[x3*Y4*2]) );
  205.     vput2( X2-(x3-1 & X3), Y2-(y3-1 & Y3), X2, Y2, b );
  206.     vput2( X2-(x3-1 & X3), Y1, X2, Y2-y3, &(b[x3*y3*2]) );
  207.     vput2( X1, Y2-(y3-1 & Y3), X2-x3, Y2, &(b[x3*Y4*2]) );
  208.     vput2( X1, Y1, X2-x3, Y2-y3, &(b[(x3*Y4+(X3-x3+1)*y3)*2]) );
  209. }
  210.  
  211. void rollsander( int mb, int mx, int my )
  212. {
  213.     int x2, y2;
  214.     mx = wnx(mx);
  215.     my = wny(my);
  216.     do {
  217.         MOS_rdpos( &mb, &x2, &y2 );
  218.         rollsub( mx - wnx(x2) & NX3, my - wny(y2) & NY3, NX1, NY1, NX3, NY3 );
  219.         if (NX4!=WX4)
  220.             wkk();
  221.         mx = wnx(x2);
  222.         my = wny(y2);
  223.     }    while (mb);
  224. }
  225.  
  226. void tometen(int x1, int y1, int x2, int y2)
  227. {
  228.     int x, y, mb;
  229.     wpg(0);
  230.     for (y = y1; y<=y2; y++) {
  231.         EGB_writePage(work,1);
  232.         egbget(x1,y,x2,y,b);
  233.         EGB_writePage(work,0);
  234.         for (x = x1; x<=x2; x++) {
  235.             if ((WORD(b+(x-x1)*2) & 0x8000)!=0) {
  236.                 line(x*bi,y*bi,(x+1)*bi-1,(y+1)*bi-1,15);
  237.                 line((x+1)*bi-1,y*bi,x*bi,(y+1)*bi-1,8);
  238.             }
  239.         }
  240.     }
  241.     MOS_typeRom2( 76, 8, 8, mpat );
  242.     wpg(1);
  243.     mbin(&mb,&x,&y);
  244.     mbout(&mb,&x,&y);
  245.     wpg(0);
  246.     boxf(x1*bi,y1*bi,(x2+1)*bi-1,(y2+1)*bi-1,0);
  247.     MOS_typeRom2( 81, 1, 1, mpat );
  248.     wpg(1);
  249. }
  250.  
  251. void vtengh(void)
  252. {
  253.     int x, y, h, s, v;
  254.     char *p;
  255.     p = b;
  256.     c32toHSV(mcl[0], &h,&s,&v);
  257.     for (y=0; y<256; y+=2)
  258.         for (x=0; x<256; x+=2) {
  259.             WORD(p) = HSVto32k(h, y, x);
  260.             p+=2;
  261.         }
  262.     vput2(BX1,BY1,BX2,BY2,b);
  263. }
  264.  
  265. void vtengs(void)
  266. {
  267.     int x, y, h, s, v;
  268.     char *p;
  269.     p = b;
  270.     c32toHSV(mcl[0], &h,&s,&v);
  271.     for (y=0; y<256; y+=2)
  272.         for (x=0; x<512*3; x+=12) {
  273.             WORD(p) = HSVto32k(x, s, y);
  274.             p+=2;
  275.         }
  276.     vput2(BX1,BY1,BX2,BY2,b);
  277. }
  278.  
  279. void vtengv(void)
  280. {
  281.     int x, y, h, s, v;
  282.     char *p;
  283.     p = b;
  284.     c32toHSV(mcl[0], &h,&s,&v);
  285.     for (y=0; y<256; y+=2)
  286.         for (x=0; x<512*3; x+=12) {
  287.             WORD(p) = HSVto32k(x, y, v);
  288.             p+=2;
  289.         }
  290.     vput2(BX1,BY1,BX2,BY2,b);
  291. }
  292.  
  293. /*    編集窓用機能軍    */
  294.  
  295. void mpaint( int mb, int mx, int my )
  296. {
  297.     char pa[4];
  298.     EGB_paintMode( work, 0x22 );
  299.     EGB_color( work, 2, mcl[mb] );
  300.     WORD(pa) = wnx(mx);
  301.     WORD(pa+2) = wny(my);
  302.     EGB_closePaint( work, pa );
  303.     wkk();
  304. }
  305.  
  306. void mdr( int mb, int mx, int my )    /*    編集窓描画    */
  307. {
  308.     int mx2, my2, x, y, x2, y2;
  309.     mx2 = mx;
  310.     my2 = my;
  311.     while (mb != 0 && mx/bi >= WX1 && mx/bi <= WX2
  312.                    && my/bi >= WY1 && my/bi <= WY2 )
  313.     {
  314.         EGB_writeMode( work, (vr==128) ? 0 : 7 );
  315.         EGB_pastel( work, vr*2 );
  316.         line( wnx(mx2), wny(my2), wnx(mx), wny(my), mcl[mb] );
  317.         EGB_writeMode( work, 0 );
  318.         EGB_pastel( work, 128 );
  319.         x = wnx(mx);
  320.         x2 = wnx(mx2);
  321.         bsz( &x, &x2 );
  322.         y = wny(my);
  323.         y2 = wny(my2);
  324.         bsz( &y, &y2 );
  325.         egbget( x, y, x2, y2, b );
  326.         egbputZ( WX1+(x-NX1)*KS, WY1+(y-NY1)*KS,
  327.                  WX1+(x2-NX1+1)*KS-1, WY1+(y2-NY1+1)*KS-1,
  328.                  x2-x+1, y2-y+1, b );
  329.         mx2 = mx;
  330.         my2 = my;
  331.         MOS_rdpos( &mb, &mx, &my );
  332.     }
  333. }
  334.  
  335. void mwwp( int *mb, int *mx, int *my, int *x, int *y, void (*vfp)(), int f )
  336. {
  337.     int x2, y2, b2;
  338.     view( WX1,WY1, WX2,WY2 );
  339.     umosv( WX1,WY1, WX2,WY2 );
  340.     EGB_writeMode( work, 4 );
  341.     *mx = wcx(*mx);
  342.     *my = wcy(*my);
  343.     vfp( *mx, *my, *mx, *my, 0x7fff );
  344.     x2 = *mx;
  345.     y2 = *my;
  346.     do {
  347.         b2 = *mb;
  348.         MOS_rdpos( mb, x, y );
  349.         *x = wcx(*x);
  350.         *y = wcy(*y);
  351.         if (*x != x2 || *y != y2 ) {
  352.             vfp( *mx, *my, x2, y2, 0x7fff );
  353.             vfp( *mx, *my, *x, *y, 0x7fff );
  354.         }
  355.         x2 = *x;
  356.         y2 = *y;
  357.     }    while (*mb);
  358.     if (f==0)
  359.         vfp( *mx, *my, x2, y2, 0x7fff );
  360.     *mb = b2;
  361. }
  362.  
  363. void mline( int mb, int mx, int my, void (*vic)() )
  364. {
  365.     int x, y;
  366.     mwwp( &mb, &mx, &my, &x, &y, vic, 0 );
  367.     view( NX1,NY1, NX2,NY2 );
  368.     EGB_writeMode( work, (vr==128) ? 0 : 7 );
  369.     EGB_pastel( work, vr*2 );
  370.     vic( nbx(mx), nby(my), nbx(x), nby(y), mcl[mb] );
  371.     EGB_writeMode( work, 0 );
  372.     EGB_pastel( work, 128 );
  373.     wkk();
  374. }
  375.  
  376. void mcpyl( int mb, int mx, int my, int c )
  377. {
  378.     int x, y, x2, y2, x3, y3;
  379.     mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
  380.     bsz( &mx, &x );
  381.     bsz( &my, &y );
  382.     egbget( nbx(mx),nby(my), nbx(x),nby(y), b );
  383.     boxb( mx, my, x, y, 0x7fff );
  384.     mbin( &mb, &x3, &y3 );
  385.     if (mb == 1) {
  386.         if (c) {
  387.             EGB_writeMode( work, 0 );
  388.             boxf(wnx(mx),wny(my), wnx(x), wny(y), mcl[2] );
  389.             EGB_writeMode( work, 4 );
  390.         }
  391.         x3 = wcx(x3);
  392.         y3 = wcy(y3);
  393.         mx -= x3;
  394.         my -= y3;
  395.         x -= x3;
  396.         y -= y3;
  397.         do {
  398.             MOS_rdpos( &mb, &x2, &y2 );
  399.             x2 = wcx(x2);
  400.             y2 = wcy(y2);
  401.             while ( x2+x > WX2 )
  402.                 x2-=KS;
  403.             while ( y2+y > WY2 )
  404.                 y2-=KS;
  405.             while ( x2+mx < WX1 )
  406.                 x2+=KS;
  407.             while ( y2+my < WY1 )
  408.                 y2+=KS;
  409.             if (x3 != x2 || y3 != y2 ) {
  410.                 boxb( x3+mx,y3+my, x3+x,y3+y, 0x7fff );
  411.                 boxb( x2+mx,y2+my, x2+x,y2+y, 0x7fff );
  412.             }
  413.             x3 = x2;
  414.             y3 = y2;
  415.         }    while (mb);
  416.         view( NX1,NY1, NX2,NY2 );
  417.         vput2( nbx(x3+mx),nby(y3+my), nbx(x3+x),nby(y3+y), b );
  418.     }
  419.     EGB_writeMode( work, 0 );
  420.     wkk();
  421. }
  422.  
  423. /*
  424. void boke(int mx, int my, int x, int y)
  425. {
  426.     int n=0x80, si, x1, y1, x2, y2;
  427.     char pa[64];
  428.     WORD(pa+0)=4;
  429.     WORD(pa+2)=mx;
  430.     WORD(pa+4)=my;
  431.     WORD(pa+6)=x;
  432.     WORD(pa+8)=my;
  433.     WORD(pa+10)=x;
  434.     WORD(pa+12)=y;
  435.     WORD(pa+14)=mx;
  436.     WORD(pa+16)=y;
  437.     EGB_region( work, &n, &si, &x1,&y1, &x2,&y2, pa );
  438.     EGB_resolve(work,b);
  439. }
  440. */
  441.  
  442. void hten(int x, int y, int x2, int y2)
  443. {
  444.     EGB_writeMode( work, 4 );
  445.     boxf( x,y, x2,y2, 0x7fff );
  446.     EGB_writeMode( work, 0 );
  447. }
  448.  
  449. void monocol(int x, int y, int x2, int y2)
  450. {
  451.     int i,h,s,v;
  452.     if (x2<x) {    i=x; x=x2; x2=i; }
  453.     if (y2<y) {    i=y; y=y2; y2=i; }
  454.     egbget(x,y,x2,y2,b);
  455.     for (i = 0; i<(x2-x+1)*(y2-y+1)*2; i+=2) {
  456.         c32toHSV(WORD(b+i),&h,&s,&v);
  457.         WORD(b+i) = (v>>3) * 0x421 | (WORD(b+i) & 0x8000);
  458.     }
  459.     vput2(x,y,x2,y2,b);
  460. }
  461.  
  462. void monocol2(int x, int y, int x2, int y2)
  463. {
  464.     int i, gc,rc,bc;
  465.     if (x2<x) {    i=x; x=x2; x2=i; }
  466.     if (y2<y) {    i=y; y=y2; y2=i; }
  467.     egbget(x,y,x2,y2,b);
  468.     for (i = 0; i<(x2-x+1)*(y2-y+1)*2; i+=2) {
  469.         gc = (WORD(b+i) >> 10) & 0x1f;
  470.         rc = (WORD(b+i) >>  5) & 0x1f;
  471.         bc =  WORD(b+i)           & 0x1f;
  472.         WORD(b+i) = (gc+rc+bc+1) / 3 * 0x421 | (WORD(b+i) & 0x8000);
  473.     }
  474.     vput2(x,y,x2,y2,b);
  475. }
  476.  
  477. void tens(int mb, int mx, int my, void (*vic)())
  478. {
  479.     int x, y;
  480.     mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
  481.     EGB_writeMode( work, 0 );
  482.     view(NX1,NY1,NX2,NY2);
  483.     mx = nbx(mx);
  484.     my = nby(my);
  485.     x = nbx(x);
  486.     y = nby(y);
  487.     vic(mx,my,x,y);
  488.     wkk();
  489. }
  490.  
  491. void kakshk(int mb, int mx, int my)
  492. {
  493.     int x, y, x2, y2, ox, oy, ox2, oy2;
  494.     ox = mx;
  495.     oy = my;
  496.     mwwp( &mb, &ox,&oy, &ox2,&oy2, boxb, 0 );
  497.     egbget( nbx(ox),nby(oy), nbx(ox2),nby(oy2), b );
  498.     boxb(ox,oy,ox2,oy2,0x7fff);
  499.     x2 = abs(nbx(ox2)-nbx(ox))+1;
  500.     y2 = abs(nby(oy2)-nby(oy))+1;
  501.     mbin(&mb,&mx,&my);
  502.     mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
  503.     boxb(ox,oy,ox2,oy2,0x7fff);
  504.     EGB_writeMode(work,0);
  505.     egbputZ( nbx(mx),nby(my), nbx(x),nby(y), x2,y2, b );
  506.     wkk();
  507. }
  508.  
  509. void polys( int mb, int mx, int my, char *b )
  510. {
  511.     int i=6, x, y, ox, oy;
  512.     view( WX1,WY1, WX2,WY2 );
  513.     umosv( WX1,WY1, WX2,WY2 );
  514.     ox = mx;
  515.     oy = my;
  516.     WORD(b+2) = wnx(mx);
  517.     WORD(b+4) = wny(my);
  518.     EGB_writeMode(work,4);
  519.     line( wcx(mx),wcy(my), wcx(mx),wcy(my), 0x7fff );
  520.     while(mb!=2 && i<1020) {
  521.         do {
  522.             x = mx;
  523.             y = my;
  524.             MOS_rdpos(&mb,&mx,&my);
  525.             if (wcx(x)!=wcx(mx) || wcy(y)!=wcy(my)) {
  526.                 line( wcx(ox),wcy(oy), wcx(x),wcy(y), 0x7fff );
  527.                 line( wcx(ox),wcy(oy), wcx(mx),wcy(my), 0x7fff );
  528.             }
  529.         }    while(mb==0 || (mb==1 && wcx(ox)==wcx(mx) && wcy(oy)==wcy(my)));
  530.         ox = mx;
  531.         oy = my;
  532.         WORD(b+i)   = wnx(mx);
  533.         WORD(b+i+2) = wny(my);
  534.         i+=4;
  535.     }
  536.     WORD(b)=(i-2)/4;
  537.     view( NX1,NY1, NX2,NY2 );
  538.     EGB_writeMode( work, 0 );
  539. }
  540.  
  541. void polyg( int mb, int mx, int my )
  542. {
  543.     polys(mb, mx, my, b);
  544.     EGB_writeMode( work, (vr==128) ? 0 : 7 );
  545.     EGB_pastel( work, vr*2 );
  546.     EGB_paintMode(work, 0x22);
  547.     EGB_color(work, 0, mcl[1]);
  548.     EGB_color(work, 2, mcl[1]);
  549.     EGB_polygon( work, b );
  550.     EGB_writeMode( work, 0 );
  551.     EGB_pastel( work, 128 );
  552.     wkk();
  553.     mbout(&mb,&mx,&my);
  554. }
  555.  
  556. void polyboke( int mb, int mx, int my )
  557. {
  558.     int n=0x80, si, x1, y1, x2, y2;
  559.     char pa[2048];
  560.     polys(mb, mx, my, pa);
  561.     if (WORD(pa) >= 3) {
  562.         EGB_region( work, &n, &si, &x1,&y1, &x2,&y2, pa );
  563.         EGB_resolve(work, b);
  564.     }
  565.     wkk();
  566.     mbout(&mb, &mx, &my);
  567. }
  568.  
  569. void mnw( int mb, int mx, int my )        /*    編集窓    */
  570. {
  571.     view( NX1, NY1, NX2, NY2 );
  572.     switch(mei[0])
  573.     {
  574.     case 1:    mline( mb, mx, my, line );        break;
  575.     case 2:    mline( mb, mx, my, boxb );        break;
  576.     case 3:    mline( mb, mx, my, boxf );        break;
  577.     case 4:    mline( mb, mx, my, circlen2 );    break;
  578.     case 5:    mline( mb, mx, my, circlef2 );    break;
  579.     case 6:    mline( mb, mx, my, circlenl );    break;
  580.     case 7:    mline( mb, mx, my, circlefl );    break;
  581.     case 8:    tens(mb, mx, my, udten);        break;
  582.     case 9:    tens(mb, mx, my, lrten);        break;
  583.     case 10: polyg( mb, mx, my );            break;
  584.     case 11: mpaint( mb, mx, my );            break;
  585.     case 12: mcpyl( mb, mx, my, 0 );        break;
  586.     case 13: rollsander( mb, mx, my );        break;
  587. /*    case 14: tens( mb, mx, my, boke );        break;    */
  588.     case 14: polyboke( mb, mx, my );        break;
  589.     case 15: raten( mb, mx, my, WX1, WY1, WX2, WY2, NX1, NY1, NX2, NY2 );
  590.                 break;
  591.     case 16: kakshk( mb, mx, my );            break;
  592.     case 17: tens( mb, mx, my, hten );        break;
  593.     case 18: tens( mb, mx, my, monocol2 );    break;
  594.     case 19: tens( mb, mx, my, monocol );    break;
  595.     default: mdr( mb, mx, my );                break;
  596.     }
  597.     mosv( 0,0, 639,479 );
  598.     view( 0, 0, 1024/bi-1, 512/bi-1 );
  599. }
  600.  
  601. void mbwk( int mx, int my, int c )    /*    バッファセット用枠    */
  602. {
  603.     static int x = 0, y = 512, c2 = 0;
  604.     int mx2, my2;
  605.     if ( mx/bi < BX1 || mx/bi > BX2 || my/bi < BY1 || my/bi > BY2 )
  606.         c = 0;
  607.     if ( c == 0 ) {
  608.         if ( c2 != 0 ) {
  609.             wpg(0);
  610.             boxb( x, y, x+NX4*bi-1, y+NY4*bi-1, 0 );
  611.             wpg(1);
  612.             y = 512;
  613.         }
  614.     } else {
  615.         mx2 = gpx(mx)*bi;
  616.         my2 = gpy(my)*bi;
  617.         if ( x != mx2 || y != my2 || c2 == 0 ) {
  618.             wpg(0);
  619.             boxb( x, y, x+NX4*bi-1, y+NY4*bi-1, 0 );
  620.             boxb( mx2, my2, mx2+NX4*bi-1, my2+NY4*bi-1, 15 );
  621.             wpg(1);
  622.             x = mx2;
  623.             y = my2;
  624.         }
  625.     }
  626.     c2 = c;
  627. }
  628.  
  629. void bfsrgp( int mb, int mx, int my )    /*    重ね合わせ    */
  630. {
  631.     int mx2, my2;
  632.     mx2 = gpx(mx);
  633.     my2 = gpy(my);
  634.     if (mb == 1) {
  635.         wget();
  636.         vput2(mx2, my2, mx2+NX3, my2+NY3, wb );
  637.     } else {
  638.         egbget( NX1, NY1, NX2, NY2, b );
  639.         egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
  640.         vput2( 320, 0, 320+NX3, NY3, wb );
  641.         EGB_color( work, 3, mcl[2] );
  642.         EGB_writeMode( work, 6 );
  643.         egbput( 320, 0, 320+NX3, NY3, b );
  644.         EGB_writeMode( work, 0 );
  645.         egbget( 320, 0, 320+NX3, NY3, wb );
  646.         wput();
  647.     }
  648. }
  649.  
  650. void bfdraw( int mb, int mx, int my )
  651. {
  652.     int mx2, my2;
  653.     mx2 = mx;
  654.     my2 = my;
  655.     while (mb != 0)    {
  656.         if (mx2/bi < BX1 || mx2/bi > BX2 || my2/bi < BY1 || my2/bi > BY2 )
  657.             break;
  658.         line( mx2/bi, my2/bi, mx/bi, my/bi, mcl[mb] );
  659.         mx2 = mx;
  660.         my2 = my;
  661.         MOS_rdpos( &mb, &mx, &my );
  662.     }
  663. }
  664.  
  665. void cols16(int mb, int mx, int my)
  666. {
  667.     int i;
  668.     if (mb==1) {
  669.         i=(mx-CSX1)/CSX4;
  670.         boxf(CSX1+i*CSX4,CSY1,CSX1+i*CSX4+CSX3,CSY2,mcl[1]);
  671.     } else {
  672.         egbget( mx,my, mx,my, b );
  673.         mcl[1] = WORD(b);
  674.         mbclp();
  675.     }
  676. }
  677.  
  678. void cols16g(int mb)
  679. {
  680.     int f, i, j, k=0;
  681.     egbget(NX1,NY1,NX2,NY2,b);
  682.     for ( i=0; i<16; i++ ) {
  683.         WORD(b+32768+i*2) = 0;
  684.     }
  685.     for (i = 0; i < NX4*NY4*2; i+=2) {
  686.         f = 0;
  687.         for (j=0; j<k; j++) {
  688.             if (WORD(b+32768+j*2)==WORD(b+i)) {
  689.                 f = 1;
  690.                 break;
  691.             }
  692.         }
  693.         if (f==0) {
  694.             WORD(b+32768+k*2) = WORD(b+i);
  695.             k++;
  696.         }
  697.         if (k>15)
  698.             break;
  699.     }
  700.     egbget(CSX1, CSY1, CSX2-CSX4*k, CSY2, b+65536);
  701.     vput2(CSX1+CSX4*k, CSY1, CSX2, CSY2, b+65536);
  702.     egbputZ(CSX1, CSY1, CSX1+CSX4*k-1, CSY2, k,1, b+32768);
  703.     mbout(&mb,&i,&j);
  704. }
  705.  
  706. void brolls( int mb, int mx, int my )
  707. {
  708.     int x2, y2, x3, y3;
  709.     mx = mx/bi;
  710.     my = my/bi;
  711.     do {
  712.         MOS_rdpos( &mb, &x2, &y2 );
  713.         x3 = mx - x2/bi & BX3;
  714.         y3 = my - y2/bi & BY3;
  715.         rollsub( x3, y3, BX1, BY1, BX3, BY3 );
  716.         mx = x2/bi;
  717.         my = y2/bi;
  718.     }    while (mb);
  719. }
  720.  
  721. void colch(int mb, int mx, int my)
  722. {
  723.     egbget( BX1,BY1, BX2,BY2, b );
  724.     boxf( BX1,BY1, BX2,BY2, mcl[1] );
  725.     EGB_writeMode(work,6);
  726.     EGB_color(work,3,mcl[2]);
  727.     egbput( BX1,BY1, BX2,BY2, b );
  728.     EGB_writeMode(work,0);
  729.     mbout(&mb, &mx, &my);
  730. }
  731.  
  732. void pastgo(int mb, int mx, int my)
  733. {
  734.     int mx2, my2;
  735.     mx2 = gpx(mx);
  736.     my2 = gpy(my);
  737.     if (mb == 1) {
  738.         wget();
  739.         vput2(mx2, my2, mx2+NX3, my2+NY3, wb );
  740.     } else {
  741.         egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
  742.         EGB_writeMode( work, 7 );
  743.         egbput( NX1, NY1, NX2, NY2, wb );
  744.         EGB_writeMode( work, 0 );
  745.         wkk();
  746.         mbout(&mb,&mx,&my);
  747.     }
  748. }
  749.  
  750. void mbuff( int mb, int mx, int my )        /*    バッファ    */
  751. {
  752.     void (*(vb[]))() ={ bfgp, bfsrgp, bfdraw, brolls, colch, pastgo};
  753.     view( BX1, BY1, BX2, BY2 );
  754.     vb[((mei[1]<6) ? mei[1] : 0)](mb, mx, my);
  755.     view( 0, 0, 1024/bi-1, 512/bi-1 );
  756. }
  757.  
  758. int OKM_fsel2( char *nn, char *tt, int f )
  759. {
  760.     if (OKM_fsel( nn, tt, 0 ) == 0 )
  761.         return ((f!=0) ? sachk(nn) : 0 );
  762.     else
  763.         return (1);
  764. }
  765.  
  766. void OKM_fsel3( char *nn, char *tt, int (*vp)(char *na), int f )
  767. {
  768.     if (OKM_fsel2( nn, tt, f ) == 0)
  769.         vp( nn );
  770. }
  771.  
  772. /*
  773. int tomself(char *nn, char *ext )
  774. {
  775.     int ret;
  776.     EGB_writePage(work,0);
  777.     ret = TOM_filesel( work, nn, ext, 224, 60 );
  778.     EGB_writePage(work,1);
  779.     return (ret);
  780. }
  781.  
  782. void tomself2(char *nn, char *ext, int (*fads)(char *, char *, int, int ) )
  783. {
  784.     if (tomself( nn, ext ) != 1)
  785.         fads( work, nn, BX1, BY1 );
  786. }
  787. */
  788. /*
  789. void mos2c(int mx, int my, int x1, int y1, int x2, int y2, void (*vf)())
  790. {
  791.     if ( x1 >= mx && mx <= x2 && y1 <= my && my <= y2 )
  792.         vf(mb, mx, my);
  793. }
  794. */
  795.  
  796. void mosmen(int mb, int mx, int my)
  797. {
  798.     static char nn[FILENAME_MAX];
  799.  
  800.     switch(MEN_menu( mb, mx, my ))
  801.     {
  802.     case 1:
  803.         message2(4, "G-Pen32k    ver.1.063",
  804.                     "Free Software Collection Version",
  805.                     __DATE__" "__TIME__" Compiled.",
  806.                     "Copyright(C) 1991-1994 OKOME", 1);
  807.         break;
  808.     case 101:
  809.         if (OKM_fsel2( nn, "TIFF読み込み", 0 ) == 0) {
  810.             EGB_color(work, 0, mcl[1]);
  811.             tiffload(nn, BX1, BY1);
  812.         }
  813.         break;
  814.     case 102:
  815.         if (OKM_fsel2( nn, "TIFF保存", 1 ) == 0)
  816.             tiffsave(nn, BX1, BY1, BX2, BY2, 0, 0);
  817.         break;
  818.     case 103:
  819.         if (OKM_fsel2( nn, "TIFF圧縮保存", 1 ) == 0) {
  820.             MOS_typeRom2(82,16,16,mpat);
  821.             tiffsave(nn, BX1, BY1, BX2, BY2, 1, 0);
  822.             MOS_typeRom2(81,0,0,mpat);
  823.         }
  824.         break;
  825.     case 104:
  826.         if (OKM_fsel2( nn, "SPRITEload", 0 ) == 0)
  827.             sprload( nn, BX1, BY1 );
  828.         break;
  829.     case 105:
  830.         if (OKM_fsel2( nn, "SPRITEsave", 1 ) == 0)
  831.             sprsave( nn, BX1, BY1 );
  832.         break;
  833.     case 106:
  834.         if (OKM_fsel2( nn, "PATTERN4load", 0 ) == 0)
  835.             ptnload4pg( nn, NX4,NY4 );
  836.         break;
  837.     case 107:
  838.         if (OKM_fsel2( nn, "PATTERN4save", 1 ) == 0)
  839.             ptnsave4pg( nn, NX4,NY4 );
  840.         break;
  841.     case 108:    OKM_fsel3( nn, "16色LOAD", ptr16dlo, 0 );    break;
  842.     case 109:    OKM_fsel3( nn, "16色化SAVE", ptr16dsa, 1 );    break;
  843.     case 110:    OKM_fsel3( nn, "C言語保存", cdasave, 1 );    break;
  844. /*    case 201:    tomself2( nn, "*.pat", loadpat );    break;
  845.     case 202:    tomself2( nn, "*.pat", savepat );    break;
  846.     case 203:
  847.         if (tomself( nn, "*.spr" ) != 1) {
  848.             loadpeo( nn, b, vp0 );
  849.             vput2( BX1,BY1, BX2,BY2, vp);
  850.         }
  851.         break;
  852.     case 204:
  853.         if (tomself( nn, "*.spr" ) != 1) {
  854.             egbget( BX1, BY1, BX2, BY2, vp );
  855.             savepeo( work, nn, b, vp0 );
  856.         }
  857.         break;
  858.     case 205:
  859.         if (tomself( nn, "*.ano" ) != 1) {
  860.             loadano( work, nn, BX1, BY1 );
  861.             vput2( BX1,BY1, BX2,BY2, vp);
  862.         }
  863.         break;
  864.     case 206:    tomself2( nn, "*.ano", saveano );    break;
  865.     case 207:    tomself2( nn, "*.fce", loadkao );    break;
  866.     case 208:    tomself2( nn, "*.fce", savekao );    break;
  867.     case 209:    tomself2( nn, "*.til", loadtil );    break;
  868.     case 210:    tomself2( nn, "*.til", savetil );    break;
  869. */    case 201:    wpg(0);    wkugiri(3);    wpg(1);    break;
  870.     case 202:    wpg(0);    wkugiri(2);    wpg(1);    break;
  871.     case 203:    ten(NX1,NY1,NX4);    wkk();    break;
  872.     case 204:    ten(BX1,BY1,BX4);            break;
  873.     case 205:    vtengh();    break;
  874.     case 206:    vtengs();    break;
  875.     case 207:    vtengv();    break;
  876.     case 208:    tometen(BX1,BY1,BX2,BY2);    break;
  877.     case 209:
  878.         EGB_writeMode( work, 10 );
  879.         boxf(BX1-1, BY1-1, BX2+1, BY2+1,0x8000);
  880.         EGB_writeMode( work, 0 );
  881.         break;
  882.     case 210:
  883.         EGB_writeMode( work, 11 );
  884.         boxf(BX1-1, BY1-1, BX2+1, BY2+1,0x8000);
  885.         EGB_writeMode( work, 0 );
  886.         break;
  887.     case 9998:    wsize(mb,1);    break;
  888.     case 5:
  889.     case 9999:    endu();        break;
  890.     default:    break;
  891.     }
  892. }
  893.  
  894. void keymod(unsigned int kb)
  895. {
  896.     switch(kb)
  897.     {
  898.     case 0x8016:
  899.     case 0x9:    page(-1);    break;
  900.     case 0x8017:
  901.     case 0x1b:    page( 1);    break;
  902.     case 'A':    aqy();        break;
  903.     case 'B':    hten(NX1,NY1,NX2,NY2);    wkk();    break;
  904.     case 'C':    wcls();        break;
  905.     case 'D':    bcls();        break;
  906.     case 'F':    udten(NX1,NY1,NX2,NY2);    wkk();    break;
  907.     case 'G':    lrten(NX1,NY1,NX2,NY2);    wkk();    break;
  908.     case 'H':    hten(BX1,BY1,BX2,BY2);            break;
  909.     case 'K':    ten(NX1,NY1,NX4);        wkk();    break;
  910.     case 'M':    monocol(BX1,BY1,BX2,BY2);        break;
  911.     case 'Q':    aqx();        break;
  912.     case 'S':    vtengs();    break;
  913.     case 'V':    vtengv();    break;
  914.     case 'W':    vtengh();    break;
  915.     case 'X':    lrten(BX1,BY1,BX2,BY2);            break;
  916.     case 'Y':    ten(BX1,BY1,BX4);                break;
  917.     case 'Z':    udten(BX1,BY1,BX2,BY2);            break;
  918.     case 0x801D:    endu();        break;
  919.     default:
  920.         if (strchr(MEN_skey,kb-'a'+'A')!=NULL)
  921.             MEN_sideexec(strchr(MEN_skey,kb-'a'+'A')-MEN_skey+1);
  922.         break;
  923.     }
  924. }
  925.  
  926. void mouse()        /*    マウス総合領域    */
  927. {
  928.     int mb, mx, my, mx2, my2;
  929.     unsigned int kb, en;
  930.     while(1) {
  931.         MOS_rdpos( &mb, &mx, &my );
  932.         mx2 = mx / bi;
  933.         my2 = my / bi;
  934.         mbwk( mx, my, ( mei[1] == 2 || mei[1] == 3 ) ? 0 : 1 );
  935.         if ((kb = KYB_read(1,&en)) != 0xffff)
  936.             keymod(kb);
  937.         if (mb)    {
  938.             if ( mx2 >= WX1 && mx2 <= WX2 &&
  939.                  my2 >= WY1 && my2 <= WY2 )
  940.                 mnw( mb, mx, my );    /*    編集窓    */
  941.             else if ( mx2 >= BX1 && mx2 <= BX2 &&
  942.                       my2 >= BY1 && my2 <= BY2 )
  943.                     mbuff( mb, mx, my );    /*    バッファ    */
  944.             else if ( my2 >= PALY && my2 < (PALY+PALB*3) &&
  945.                       mx2 >= PALX && mx2 <  PALX + 128)
  946.                     mcolm( mb, mx, my );    /*    カラーボックス    */
  947.             else if ( mx >= MEX1 && my >= MEY1 && mx < MEX1 + MEX4 * MEX2 &&
  948.                       MEZ0 > ((mx-MEX1) / MEX4) + MEX2*(( my-MEY1 ) /MEY4 ))
  949.                     gmenu( mx, my );    /*    編集メニュー    */
  950.             else if ( mx2 >= PCX1 && mx2 <= PCX2 && 
  951.                       my2 >= PCY1 && my2 <= PCY2 )
  952.                     mcolm2( mb );    /*    ボタンへ色セット    */
  953.             else if ( mx2 >= PRX1 && mx2 <= PRX2 &&
  954.                       my2 >= PRY1 && my2 <= PRY2 )
  955.                     mcols( mcl[2-bc] );
  956.             else if ( mx2 >= PLX1 && mx2 <= PLX2 &&
  957.                       my2 >= PLY1 && my2 <= PLY2 )
  958.                     mcols( mcl[1+bc] );
  959.             else if ( mx >= PAX1 && mx <= PAX2 &&
  960.                       my >= PAY1 && my <= PAY2 )
  961.                     pbtn( mb );        /*    ページ変更    */
  962.             else if ( mx >= SPX1 && mx <= SPX2 &&
  963.                       my >= SPY1 && my <= SPY2 )
  964.                     mspoit();
  965.             else if ( mx2 >= CBX1 && mx2 <= CBX2 &&
  966.                       my2 >= CBY1 && my2 <= CBY2 )
  967.                     tclc(mb, mx, my);
  968.             else if ( mx2 >= CBLX1 && mx2 <= CBLX2 &&
  969.                       my2 >= CBLY1 && my2 <= CBLY2 )
  970.                     colmix(mb, 0);
  971.             else if ( mx2 >= CBRX1 && mx2 <= CBRX2 &&
  972.                       my2 >= CBRY1 && my2 <= CBRY2 )
  973.                     colmix(mb, 1);
  974.             else if ( mx2 >= NX1 && mx2 <= NX2 &&
  975.                       my2 >= NY1 && my2 <= NY2 && NX4!=128 )
  976.                     wsize(mb, 0);
  977.             else if ( mx2 >= PALX-12 && mx2 <= PALX-4 &&
  978.                       my2 >= PALY && my2<= PALY+PALB*3-1 )
  979.                     hsrg(2);
  980.             else if ( mx >= HX1 && mx <= HX2 &&
  981.                       my >= HY1 && my <= HY2 )
  982.                     bfgs(mb);
  983.             else if ( mx >= RX1 && mx <= RX2 &&
  984.                       my >= RY1 && my <= RY2 )
  985.                     rchc();
  986.             else if ( mx >= VX1 && mx <= VX2 &&
  987.                       my >= VY1 && my <= VY2 )
  988.                     svpp(mx);
  989.             else if ( mx2 >= CSX1 && mx2 <= CSX2 &&
  990.                       my2 >= CSY1 && my2 <= CSY2 )
  991.                     cols16(mb, mx2, my2);
  992.             else if ( mx >= CSBX1 && mx <= CSBX2 &&
  993.                       my >= CSBY1 && my <= CSBY2 )
  994.                     cols16g(mb);
  995.             else if ( my < 20 )    /*    MENUバー    */
  996.                     mosmen( mb, mx, my );
  997.         }
  998.     }
  999. }
  1000.  
  1001. _mwset_up_args()    { return 0; }    /*    argc argvを使わない    */
  1002.  
  1003. void main()
  1004. {
  1005.     int i;
  1006.     /*    初期化    */
  1007.     EGB_init( work, EgbWorkSize );
  1008.     EGB_resolution( work, 0, GM0 );
  1009.     EGB_resolution( work, 1, GM1 );
  1010.     MOS_start( mwork, MosWorkSize );
  1011.     MOS_writePage( 0 );
  1012.     mosv( 0, 0, 639, 479 );
  1013.     MOS_typeRom2( 81, 1, 1, mpat );
  1014.     KYB_init();
  1015.     KYB_clic( 1 );
  1016.     KYB_setcode( 0x0200);
  1017.     kkinit(KAN_SCRN16, KAN_MOSON);
  1018.     NX1 = nx[3];
  1019.     NY1 = ny[3];
  1020.     NX4 = 64/bi;
  1021.     NY4 = NX4;
  1022.     wb = wallb;
  1023.     for (i=0; i<5; i++) {
  1024.         wallbl[i] = wb;
  1025.         wb+= 32<<(i*2);
  1026.     }
  1027.     wallbl[5] = &(b[256*512*2-128*128*2]);
  1028.     wb = wallbl[3];
  1029.     mcl[1] = 0x7fff;
  1030.     for (vz=2000; vp0 == NULL; vz--) {
  1031.         vp0 = (char *)calloc( (vz+1)*BX4*BY4*Cb/8, 1 );
  1032.     }
  1033.     vp = vp0;
  1034.     draw();        /*    画面作り    */
  1035.     mouse();    /*    メインへ    */
  1036. }
  1037.